package com.code.p9.模板方法模式;

/**
 * 描述: 比如我们定义一个指定模板所有extends的子类都必须实现它里面所有操作
 * 悍马模型模板
 * <p>
 * 抽象模板:
 * 1.基本方法
 * 基本方法也叫做基本操作，是由子类实现的方法，并且在模板方法被调用。
 * 2.模板方法
 * 可以有一个或几个，一般是一个具体方法，也就是一个框架，实现对基本方法的调度，完成固定的逻辑。
 * 3.为了防止恶意的操作，一般模板方法都加上final关键字，不允许被覆写。
 * 4.注意　抽象模板中的基本方法尽量设计为protected类型，符合迪米特法则，不需要暴露
 * 的属性或方法尽量不要设置为protected类型。实现类若非必要，尽量不要扩大父类中的访问
 * 权限。
 *
 * @author CodeYang_Site
 * @version 2021/6/6 19:10
 */
public abstract class HummerModel {


    /*
     * 首先，这个模型要能够被发动起来，别管是手摇发动，还是电力发动，反正
     * 是要能够发动起来，那这个实现要在实现类里了
     */
    public abstract void start();  //基本方法

    //能发动，还要能停下来，那才是真本事
    public abstract void stop();

    //喇叭会出声音，是滴滴叫，还是哔哔叫
    public abstract void alarm();

    //引擎会轰隆隆地响，不响那是假的
    public abstract void engineBoom();

    // 模板方法
    //那模型应该会跑吧，别管是人推的，还是电力驱动的，总之要会跑
    //run方法是其他都要调用的 一般可以用作算法模型必须顺序
    public final void run() {
        //直接规定号调用顺序
        this.start();
        this.engineBoom();
        this.alarm();
        this.stop();
    }


}
